/**
 * \file sha1.h
 *
 *  Copyright (C) 2006-2010, Paul Bakker <polarssl_maintainer at polarssl.org>
 *  All rights reserved.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
#ifndef POLARSSL_SHA1_H
#define POLARSSL_SHA1_H

#ifndef PURG_C_INTERFACE_COMPILE
namespace purg
{
#endif

  class sha1
  {
    public:
      /**
       * \brief          SHA-1 context structure
       */
      typedef struct
      {
          unsigned long total[2];     /*!< number of bytes processed  */
          unsigned long state[5];     /*!< intermediate digest state  */
          unsigned char buffer[64];   /*!< data block being processed */

          unsigned char ipad[64];     /*!< HMAC: inner padding        */
          unsigned char opad[64];     /*!< HMAC: outer padding        */
      }
      context;

    protected:
      static void process( context *ctx, const unsigned char data[64] );

    public:
      /**
       * \brief          SHA-1 context setup
       *
       * \param ctx      context to be initialized
       */
      static void starts( context *ctx );

      /**
       * \brief          SHA-1 process buffer
       *
       * \param ctx      SHA-1 context
       * \param input    buffer holding the  data
       * \param ilen     length of the input data
       */
      static void update( context *ctx, const unsigned char *input, int ilen );

      /**
       * \brief          SHA-1 final digest
       *
       * \param ctx      SHA-1 context
       * \param output   SHA-1 checksum result
       */
      static void finish( context *ctx, unsigned char output[20] );

      /**
       * \brief          Output = SHA-1( input buffer )
       *
       * \param input    buffer holding the  data
       * \param ilen     length of the input data
       * \param output   SHA-1 checksum result
       */
      static void compute( const unsigned char *input, int ilen, unsigned char output[20] );

  };

#ifndef PURG_C_INTERFACE_COMPILE
}
#endif

#include "polar_ssl_sha1.inline.h"
#endif /* sha1.h */

